#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QSerialPortInfo>
#include <QSerialPort>
#include <QMessageBox>

#include <QChar>
#include <QMainWindow>
#include <QtCharts/QChartView>
#include <QtCharts/QSplineSeries>
#include <QValueAxis>
#include <QTimer>
#include <QTime>
#include <QDateTime>
#include <QDateTimeAxis>
#include <QValueAxis>
#include <QSplineSeries>
#include <QScrollBar>
#include <QRandomGenerator>
#include "qcustomplot.h"
#include <iostream>
#include <string>
#include "thread_acceptdata.h"
#include <string.h>
using namespace std;
QT_CHARTS_USE_NAMESPACE
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    friend class testDemo;
    QString * dataBuffer;
    int pulse_Count;//脉冲个数


private slots:
    void on_Button_Link_pressed();//串口连接

    void on_button_SendMessage_released();//发送消息

    void on_clear_InputBox_released();//清除发送区

    void on_button_acpt_clear_released();//清除接收区

    void on_checkBox_Hex_toggled(bool checked);

    void myMove(QMouseEvent *e);

    void on_btn_Save_released();//保存曲线

    void on_btn_History_released();//历史回看

    void on_btn_SlaveInit_pressed();//获取下位机最新配置

    void on_btn_Start_released();



    void updataXAxis(int pulse_Cnt,int puleFre ); //更新数据点

    void updatePort(QList<QSerialPortInfo> info); //把子线程搜索到的端口号添加到ui文件中

    void handle_PulseSysCgf( QList<QByteArray> buffer);//接受由初始化发送的指令的数据

    void handle_AllSysCgf( QList<QByteArray> buffer);//获取所有配置信息(当前生效的)

    void handle_LowComputerSysCgf( QList<QByteArray> buffer);//获取所有配置信息(包括没生效的)

    void updateStatusHandler(bool stauts); //更新启动按钮

    void jerkHandler();//硬极限端子

    void on_btn_ModifyPulFre_released();//修改脉冲频率

    void on_btn_ModifyPulCnt_released();//修改脉冲个数

    void reslvePack(QByteArray pack);

    void hotPlug();//热插拔

    void checkHeartBeat(QByteArray pack);//检测心跳包

    void on_pushButton_released();//刷新串口按钮

    void on_btn_ClearGraphic_released();

    uint8_t  calculatePartialChecksum(const QByteArray &data, int start);





private:

    Ui::Widget *ui;
    QTimer * timer1;//串口号识别

    int Count;//记录曲线点数
    int index; //校验和下标
    bool isRunning;//是否运行中
    uint8_t checkCode = 0;//校验和
    uint8_t code = 0;//功能码
    bool isFirst = true;
    uint8_t lastOutTerminal = '8';
    QThread * subThread;//子线程
    thread_AcceptData * subData;//接受数据的类
    QCPItemTracer *tracer;     // 游标
    QCPItemText *tracerLabel;  // 游标说明
    QCustomPlot * pCustomPlot;
    QByteArray * data;
    QList<QByteArray> buffer;

    QString lastPortName;//当前生效的串口


    void init();
   // QSerialPort  serial;
    double lastXPoint = -10;
    void displayHex();
    void displayText();
    void plotInit();
    void savePlotDataToJson(QCustomPlot *customPlot, const QString &filePath);
    void slaveInit(string data);
    QByteArray packData(QString dirTerminal,QString outTerminal,QString hardTerminal,QString addTime,QString subTime,QString frequency,QString cnt);//上位机给下位机的打包函数
    QByteArray packData2(QString code,QString dirTerminal,QString outTerminal,QString hardTerminal,QString addTime,QString subTime,QString frequency,QString cnt);//下位机给上位机的打包
    int unPackData(QByteArray pack);//解包
};


#endif // WIDGET_H
